10491. Коровы и машины

 

Рассмотрим следующую телеигру. Имеется три двери, за двумя из которых спрятано по корове, а за третьими – приз. Игрок выбирает дверь, стараясь угадать, где находится приз. Ведущий после выбора игроком двери предлагает следующую сделку: он согласен открыть некоторую дверь, за которой находится корова в обмен на то, что игрок сменит дверь (поменяет свое мнение). Известно, что при смене мнения игрока вероятность выиграть приз составляет 2/3. В задаче обобщается эта игра. На вход подаются количество коров ncows, призов ncars и дверей nshow, открывающихся ведущим при смене мнения игрока. Найти вероятность выигрыша игрока, если он всегда меняет свое мнение. Известно, что за каждой дверью спрятана или корова, или приз.

 

Вход. Состоит из нескольких тестов. Каждый тест содержит три целых числа ncows, ncars, nshow (1 £ cows, cars £ 10000, 0 £ shown < cows).

 

Выход. Для каждого теста вывести в отдельной строке вероятность выигрыша игрока, если после предложения ведущего он сменит свое мнение. Ответ выводить с 5 десятичными знаками.

 

Пример входа

2 1 1
5 3 2
2000 2700 900

 

Пример выхода

0.66667
0.52500

0.71056

 

 

РЕШЕНИЕ

вероятность

 

Анализ алгоритма

Для решения задачи следует записать формулу условной вероятности.

Число дверей равно doors = cows + cars. Вероятность сначала угадать корову составляет cows / doors, машину – cars / doors. После смены мнения и открытия дверей с shown коровами игрок может выбирать приз среди doorsshown – 1 закрытых дверей. Пусть вначале игрок указал на корову. Тогда среди закрытых дверей имеется cars машин, и вероятность ее выигрыша составляет

cars / (doorsshown – 1)

Если вначале игрок указал на машину, то среди закрытых дверей осталось cars – 1 машин и вероятность ее выигрыша составляет

(cars – 1) / (doorsshown – 1)

Результирующая вероятность выиграть машину равна

(cows / doors) * (cars / (doorsshown – 1)) + (cars / doors) * ((cars – 1) / (doorsshown – 1))

= (cows * cars + cars * (cars – 1)) / (doors * (doorsshown – 1)).

 

Пример

Рассмотрим первый тест. В игре имеются 3 двери. Если сначала игрок укажет на дверь с призом (вероятность 1/3), то после смены мнения он проиграет. Если сначала будет выбрана дверь с коровой (вероятность 2/3), то после открытия двери с коровой и смены мнения игрок непременно попадет на дверь с призом и выиграет. Таким образом, вероятность выигрыша составит 1/3 * 0 + 2/3 * 1 = 2/3.

 

Реализация алгоритма

Читаем входные данные, вычисляем чисто дверей doors, находим ответ по выше приведенной формуле и выводим его. Поскольку входные данные целые, то чтобы избежать потери точности при делении, следует делимое перевести в действительный тип, умножив его на 1.0.

 

while(scanf("%d %d %d",&cows,&cars,&shown) == 3)

{

  doors = cows + cars;

  res = 1.0*((cars-1)*cars + cars*cows)/(doors*(doors-shown-1));

  printf("%.5lf\n",res);

}